const sendResponse = require('../utils/response');

// 定义路由所需要的权限代码
const ROUTE_PERMISSIONS = {
  // 用户管理权限
  'user': ['User'], // 获取用户列表需要 'User' 权限
  'user/save': ['btn.User.add'], // 创建用户需要 'btn.User.add' 权限
  'user/remove': ['btn.User.remove'],
  'user/batchRemove': ['btn.User.remove'],
  'user/update': ['btn.User.update'],
  'user/doAssignRole': ['btn.User.assgin'],

  // 角色管理权限
  'role': ['Role'],
  'role/save': ['btn.Role.add'],
  'role/remove': ['btn.Role.remove'],
  'role/update': ['btn.Role.update'],

  // 菜单管理权限
  'permission': ['Permission'],
  'permission/save': ['btn.Permission.add'],
  'permission/remove': ['btn.Permission.remove'],
  'permission/update': ['btn.Permission.update'],
  'permission/doAssign': ['btn.Role.assgin'],

  // 商品管理权限
  // 品牌管理权限
  'baseTrademark': ['Trademark'],
  'baseTrademark/save': ['btn.Trademark.add'],
  'baseTrademark/remove': ['btn.Trademark.remove'],
  'baseTrademark/update': ['btn.Trademark.update'],

  // 属性管理权限
  'attr': ['Attr'],
  'attr/save': ['btn.Attr.add', 'btn.Attr.update'],
  'attr/remove': ['btn.Attr.remove'],

  // sku管理权限
  'sku': ['Sku'],
  'sku/onSale': ['btn.Sku.updown'],
  // 'sku/save': ['btn.Sku.add', 'btn.Sku.update'],
  'sku/remove': ['btn.Sku.remove'],

  // spu管理权限
  'spu/save': ['btn.Spu.add'],
  'spu/update': ['btn.Spu.update'],
  'spu/remove': ['btn.Spu.delete'],
  
};

// 接口权限中间件
const apiPathMiddleware = (permissionPath='') => {
  return (req, res, next) => {
    try{
      // console.log(req);
      // 获取路由权限参数
      // console.log("参数传递:",permissionPath);
      
      // 匹配接口路由所需的权限对应的数组
      const requiredPermissions = ROUTE_PERMISSIONS[permissionPath];
      console.log("验证权限", requiredPermissions);

      // 如果路由所需的权限不存在，则返回 404 错误
      if (!requiredPermissions){
            return sendResponse(res, { code: 404, message: '没有找到此资源' })
      }

      // 获取用户权限信息
      const userPermissions = req.user.menus || []; // 假设权限信息存储在 req.user.menus 中
      const btnPermissions = req.user.buttons || [];
      // 把按钮权限数组和菜单权限数组合并
      const btnPathPermissions = [...btnPermissions, ...userPermissions] || []
      // console.log(btnPathPermissions);
      
      // 判断用户是否具有所需的权限
      const hasPermission = requiredPermissions.every(permission => btnPathPermissions.includes(permission));
      console.log("验证权限结果", hasPermission);
      // 首先判断是否触发按钮权限验证，没有触发判断就菜单权限
      // 需要验证菜单权限，不需要验证按钮权限
      if (!hasPermission)
        // 如果用户没有菜单权限，则返回 403 错误
        return sendResponse(res, { code: 403, message: '用户没有权限访问此资源' })
      
      console.log('----有权限访问此资源----');
      // 如果有权限，则继续执行后续的中间件
      next();
    } catch (error) {
      next(error);
    }
  }
};


module.exports = { apiPathMiddleware };
